package fr.umlv.ig.model;


import fr.umlv.ig.listener.LineListener;
import fr.umlv.ig.listener.MetroListener;
import fr.umlv.ig.listener.TrainsListener;


/**
 * Represents the model of the applications. It's extends of {@link LineModel},
 * {@link StationModel}, {@link LineModel} and {@link ItineraryModel}
 * 
 * @author Jenseric Catbagan
 * @author William Choy
 *
 */
public interface MetroModel extends LineModel, StationModel, TrainModel, 
	ItineraryModel  {
	/**
	 * Returns the number of line in the model.
	 * @return the number of line in the model.
	 */
	public int getCountLine();
	
	/**
	 * Returns the line in the index in parameter.
	 * @param index the index where to find the Line.
	 * @return the line in the index in parameter.
	 */
	public Line getLine(int index);
	
	/**
	 * Returns the number of station in the model.
	 * @return the number of stations in the model.
	 */
	public int getCountStation();

	/**
	 * Adds a {@link LineListener} to the model.
	 * @param listener the {@link LineListener} to be add.
	 */  
	public void addLineListener(LineListener listener);

	/**
	 * Removes a {@link LineListener} to the model.
	 * @param listener the {@link LineListener} to be remove.
	 */ 	
	public void removeLineListener(LineListener listener);
	
	/**
	 * Adds a {@link TrainsListener} to the model.
	 * @param listener the {@link LineListener} to be add.
	 */  
	public void addTrainsListener(TrainsListener listener);
	
	/**
	 * Removes a {@link TrainsListener} to the model.
	 * @param listener the {@link TrainsListener} to be remove.
	 */ 
	public void removeTrainsListener(TrainsListener listener);
	
	
	/**
	 * Adds a {@link MetroListener} to the model.
	 * @param listener the {@link MetroListener} to be add.
	 */  
	public void addMetroListener(MetroListener listener);
	
	/**
	 * Removes a {@link MetroListener} to the model.
	 * @param listener the {@link MetroListener} to be remove.
	 */ 
	public void removeMetroListener(MetroListener listener);
	

}